from django.shortcuts import render

# Create your views here.
from django.http import HttpResponse
from django.views import View
from django.http import JsonResponse


class ImageCodeView(View):
    def get(self,request,uuid):
        #接受路由中的uuid
        #生成图片验证码和图片二进制
        from libs.captcha.captcha import captcha
        text,image=captcha.generate_captcha()

        #通过redis把图片保存起来
        #3.1 进行redis的连接
        from django_redis import get_redis_connection
        redis_cli =get_redis_connection('code')
        #3.2 指令操作
        redis_cli.setex(uuid,100,text)
        #4.返回图片二进制
        return HttpResponse(image,content_type='image.jpeg')

class SmsCodeView(View):
    def get(self,request,mobile):
        #获取数据
        image_code=request.GET.get('image_code')
        uuid =request.GET.get('image_code_id')
        if not all([image_code,uuid]):
            return JsonResponse({'code':400,'errmsg':'参数不全'})
        #验证图像验证码
        #连接redis
        from django_redis import get_redis_connection
        redis_cli=get_redis_connection('code')
        #获取redis数据
        redis_image=redis_cli.get(uuid)
        if redis_image is None:
            return JsonResponse({'code': 400, 'errmsg': '图片验证码已过期'})
        #对比
        if redis_image == image_code:
            return JsonResponse({'code':400,'errmsg':'图片验证码错误'})
        send_flag=redis_cli.get('send_flag_%s'%mobile)
        if send_flag is not None:
           return JsonResponse({'code':400,'errmasg':'乖，操作过于频繁'})
        #生成短信验证码
        from random import randint
        sms_code='%06d'%randint(0,999999)
        #1.新建管道
        #pipline =redis_cli.pipline()
        #2.管道收集指令
        #保存短信验证码
        redis_cli.setex(mobile,300,sms_code)
        #添加一个标签，有效期为60秒内容什么都可以，用来验证是否操作过于频繁
        redis_cli.setex('send_flag_%s'%mobile,60,1)
        #3.管道执行命令
        #pipline.execute()
        #发送短信验证码
        from libs.yuntongxun.sms import CCP
        CCP().send_template_sms(mobile,[sms_code,5],1)#redis通道的第一个

        from celery_tasks.sms.tasks import celery_send_sms_code
        #delay的参数等同于任务的参数
        celery_send_sms_code.delay(mobile,sms_code)
        #返回响应
        return JsonResponse({'code':0,'errmsg':'OK'})


